Quando formulate un modello per compagnie più grandi, incontrate frequentemente modelli, finalizzati alla produzione di un prodotto, che non sono limitati ad un singolo impianto. Dunque, in questa sessione, creerete un modello di gestione di produzione che includa impianti multipli. Prenderete il modello dalla sessione precedente e lo aggiornerete al fine di includere un altro indice, Impianti,che rappresenterà tutti gli impianti che sono disponibili al fine di produrre il prodotto. Attraverserete, dunque, il modello, passo per passo, e aggiornerete tutti i vettori di variabile e i limiti per rappresentare il nuovo indice.
Gli Indici di Posizione sono abbastanza comuni quando formulate un modello di gestione di produzione. Un esempio d' indice di posizione, potrebbe essere la rappresentazione d' impianti là dove una compagnia produce i prodotti per sé stessa. Altri esempi includerebbe magazzini, industrie, centri di distribuzione, etc.
E' cosa comune,; quando si lavora con modelli che includono indici di posizione, che sia permesso il trasporto tra le posizioni. Questi modelli sono spesso chiamati;modelli di trasporto o di distribuzione e saranno affrontati più in là in questa sessione.
Quando formulate piccoli e semplici modelli è ragionevole lasciare le definizioni di dati all'interno del modello. Nel momento in cui cominciate a lavorare con modelli multi-dimensionali, diventa difficile da gestire, ed è necessario spostare i dati in files separati. Lasciare i dati separati dal modello, aumenta la leggibilità del modello e rende i dati più semplici da conservare.
Il modello che state creando in questa sessione possiede indici multipli, prodotto, mese e impiantoe vettori di dati come richiesta, che è bi-dimensionale e può essere spostato in un file separato. Nel modello, invece di una lista di tutti gli elementi di dati per il vettore di dati, potete usare la parola chiave DATAFILE e poi il nome del file di dati come mostrato qui sotto:
demand[product, month] := DATAFILE("Demand.dat");
In questa Sessione, creerete una nuova formulazione di modello per il modello di Programmazione di Produzione al fine di includere impianti multipli, così come i periodi multipli che sono stati introdotti nella Sessione 4. Quello che si vuole decidere è quanto produrre per ogni prodotto, per ogni mese, in ogni impianto, così come quanto vendere e immagazzinare nell'inventario, per ogni mese, in ogni impianto.;
In questo nuovo problema avrete quattro diversi impianti p1, p2, p3, e p4. Ognuno di questi impianti può produrre tutti e tre i prodotti. Create un indice chiamato impianti che contenga i quattro differenti impianti, e poi aggiornate il modello di conseguenza aggiungendo l'indice ai vettori applicabili.
Come nella sessione precedente, il prezzo di vendita è rimasto lo stesso per ogni prodotto $120.00, $100.00, e $150.00, rispettivamante. Anche la richiesta del prodotto è rimasta la stessa come nella sessione precedente. Rifarsi alla tabella della richiesta nella Sessione 3 per i dati necessari.
Ora che avete impianti multipli, il costo della produzione per ogni prodotto è differente per ogni impianto. Questo dato si trova nella tabella sottostante:
Production Cost | A1 | A2 | A3 |
---|---|---|---|
plant 1 | $73.30 | $52.90 | $65.40 |
plant 2 | $79.00 | $52.00 | $66.80 |
plant 3 | $75.80 | $52.10 | $50.90 |
plant 4 | $82.70 | $63.30 | $53.80 |
Il tasso di produzione per ogni prodotto è inltre diverso per ogni impianto come mostrato nella tabella sottostante
Production Rate | A1 | A2 | A3 |
---|---|---|---|
plant 1 | 500 | 450 | 450 |
plant 2 | 550 | 450 | 300 |
plant 3 | 450 | 350 | 300 |
plant 4 | 550 | 400 | 350 |
Elencata di seguito troverete l'intera formulazione del modello per il Planning5. Le aggiunte al modello sono sottolineate in neretto per rendervi più facile notare i cambiamenti dal modello nella Sessione 4.
TITLE Production_Planning5; INDEX product := (A1, A2, A3); month := (Jan, Feb, Mar, Apr); plant := (p1, p2, p3, p4); DATA Price[product] := (120.00, 100.00, 115.00); Demand[product, month] := DATAFILE("Demand.dat"); ProdCost[plant, product] := DATAFILE("ProdCost.dat"); ProdRate[plant, product] := DATAFILE("ProdRate.dat"); ProdDaysAvail[month] := (23, 20, 23, 22); InvtCost[product] := (3.50, 4.00, 3.00); InvtCapacity := 800; VARIABLES Produce[plant, product, month] -> Prod; Inventory[product, month] -> Invt; Sales[product, month] -> Sale; MACROS TotalRevenue := SUM(product, month: Price * Sales); TotalProdCost := SUM(plant, product, month: ProdCost * Produce); TotalInvtCost := SUM(product, month: InvtCost * Inventory); TotalCost := TotalProdCost + TotalInvtCost; MODEL MAX Profit = TotalRevenue - TotalCost; SUBJECT TO ProdCapacity[plant, month] -> PCap: SUM(product: Produce / ProdRate) <= ProdDaysAvail; InvtBal[product, month] -> IBal: SUM(plant: Produce) + Inventory[month-1] = Sales + Inventory; MaxInventory[month] -> MaxI: SUM(product: Inventory) <= InvtCapacity; BOUNDS Sales <= Demand; END
Eseguire l'applicazione MPL.
Scegliere; File (Archivio) | Open (Aprire) e aprire il modello dalla Sessione precedente Planning4.mpl.
Scegliere; File (Archivio) | Save As (Salvare come) per salvarlo come un nuovo file di modello Planning5.mpl.
Cambiare titolo al modello per sottolineare che state lavorando con il modello Planning5:
TITLE Production_Planning5;
In questo esempio, avete quattro diverse posizioni d'impianto. Create un nuovo indice che chiamerete plant (impianto). Questo indice avrà quattro elementi p1, p2, p3, e p4 per rappresentare ogni periodo del periodo di gestione di quattro mesi. Aggiungere la seguente definizione per l'indice; plant (impianto) alla sezione INDEX (INDICE):
INDEX product := (A1, A2, A3); month := (Jan, Feb, Mar, Apr); plant := (p1, p2, p3, p4);
In questa sessione, sposterete i valori dei dati per i loro vettori bi-dimensionali ad un file esterno di dati.Quando lavorate con vettori di dati che hanno due o più dimensioni, è spesso buona idea spostare i valori dei dati in un file di dati esterno invece di elencare tutti i numeri direttamente in un file di modello. Questo mantiene i dati separati dal modello, migliora la leggibilità del modello, e rende i dati più facilmente conservabili.
Il primo vettore di dati che si desidererà spostare in un file esterno è il vettore di dati Demand (Richiesta). Nella sezione DATA (DATI) usare il comando Cut (Tagliare) dal menu Edit per rimuovere l'elenco di numeri per il vettore Demand (Richiesta) e poi introdurre la parola chiave DATAFILE e il file di nome Demand.dat al suo posto come segue:
DATA Price[product] := (120.00, 100.00, 115.00); Demand[product, month] := DATAFILE("Demand.dat");
Il prossimo passo sarà creare un file di dati Demand.dat.; Come prima cosa, aprire una nuova finestra editor di modello scegliendo New (Nuovo) nel menu File. Se avete usato il comando Edit | Cut nel precedente Passo 4 per togliere i valori dei dati, li troverete ora nella Clipboard e potrete usare il comando Edit | Paste per rimettere i dati nel file di dati. Altrimenti, potete usare la tabella di richiesta di dati dalla descrizione del problema nella Sessione 3 per introdurre i valori dei dati nel file di come segue
! Demand.dat - Demand per month for each product ! ! Demand[product,month]: ! ! Jan Feb Mar Apr ! ---------------------------- 4300, 4200, 6400, 5300, 4500, 5400, 6500, 7200, 5400, 6700, 7800, 8200
Le linee che cominciano con un punto esclamativo sono commenti usati per migliorare la leggibilità. I numeri nel file di dati possono essere separati con una virgola, uno spazio o con entrambi. Dopo aver introdotto tutti i dati, salvate il file come Demand.dat nella cartella Tutorial.
Due, tra i vettori di dati, ProdCost e ProdRate, devono essere aggiornati al fine d'includere l'indice plant. Il vettore di dati ProdCost è ora definito su due indici di dominio, plant(impianto) e product (prodotto) saranno dati valori di dati da un file esterno. Il vettore di dati ProdRate fornirà, inoltre, i valori dal file di dati. Nell'editor del modello, aggiungere l'inidice, plant, per dichiarare entrambi i vettori di dati ProdCost e ProdRate, seguiti con i filenames di dati ProdCost.dat e ProdRate.dat rispettivamante come segue:
ProdCost[plant, product] := DATAFILE("ProdCost.dat"); ProdRate[plant, product] := DATAFILE("ProdRate.dat"); ProdDaysAvail[month] := (23, 20, 23, 22); InvtCost[product] := (3.50, 4.00 3.00); InvtCapacity := 800;
Ora aprite una nuova finestra di editor selezionando File (Archivio)| New (Nuovo) nel menu per introdurre il file di dati. Inserire nei dati dalla tabella Production Cost nella descrizione del problema come segue:
! ! ProdCost.dat - Cost per item produced ! ! ProdCost[plant, product]: ! ! A1 A2 A3 ! ----------------------- 73.30, 52.90, 65.40, 79.00, 52.00, 66.80, 75.80, 52.10, 50.90, 82.70, 63.30, 53.80
Di nuovo, le linee che cominciano con un punto esclamativo sono commenti usati per migliorare la leggibilità. Dopo che avete inserito tutti i dati, salvate il file usando il nome ProdCost.dat.
Per il tasso di produzione creare un nuovo file di dati chiamato ProdRate.dat usando i valori dalla tabella nella descrizione del problema.
! ! ProdRate.dat - Items produced per day ! ! ProdRate[plant, product]: ! ! A1 A2 A3 ! ------------------ 500, 450, 450, 550, 450, 300, 450, 350, 300, 550, 400, 350
Per determinare quanto si vuole produrre per ogni prodotto, per ogni impianto, si deve aggiungere l'indice plant (impianto) alla definizione del vettore della variabile Produce (Prodotto)come segue:
VARIABLES Produce[plant, product, month] -> Prod; Inventory[product, month] -> Invt; Sales[product, month] -> Sale;
Dato che la variabile di vettore Produce (Prodotto), ora include il nuovo indice, plant (impianto), il calcolo del costo totale della produzione nella sezione MACROS ha, inoltre, bisogno di essere aggiornata per includere l'indice plant:
MACROS TotalRevenue := SUM(product, month: Price * Sales); TotalProdCost := SUM(plant, product, month: ProdCost * Produce) ; TotalInvtCost := SUM(product, month: InvtCost * Inventory); TotalCost := TotalProdCost + TotalInvtCost;
La funzione obiettivo in sè, non cambia siccome state usando le stesse macro
come nelle sessione precedente.
Il cambiamento per i vincoli della capacità di produzione è molto semplice. Aggiungere l'indice plant alla dichiarazione della capacità di produzione e il resto del vincolo rimane lo stesso.
SUBJECT TO ProdCapacity[plant, month] -> PCap: SUM(product: Produce / ProdRate) <= ProdDaysAvail;
Si può ora produrre i prodotti in ognuno dei quattro impianti, dunque, bisogna aggiornare il vincolo d'equilibrio del'inventario per includere la sommatoria, su tutti gli impianti, del vettore di variabile Produce.
InvtBal[product, month] -> IBal: SUM(plant: Produce) + Inventory[month-1] = Sales + Inventory;
Dopo aver terminato d'introdurre il modello, dovreste salvarlo scegliendo Save (Salvare)dal menu File (Archivio).
Dato che abbiamo aggiunto più indici al modello, il numero delle variabili è aumentato considerevolmente. Tipicamente, quando si lavora con ampi modelli, chi sviluppa il modello vuole includere solo alcuni dei valori nella soluzione. Nel nostro caso, per ridurre i dati in uscita, vogliamo includere solo le variabili che hanno valori di soluzione diversi da zero. MPL possiede un numero di finestre di dialogo di opzioni nel menu Options (Opzioni) in cui è possibile cambiare il carattere di default del programma. Una delle finestre di dialogo è la Solution File Options (Opzioni d'Archivio delle Soluzioni) dove potete aggiustare ciò che è incluso nel file di soluzione. Per cambiare il default al fine d'includere i valori diversi da zero solo nel file di soluzione fare ciò che segue:
Dal menu Options (Opzioni) scegliere Solution File (File di Soluzione) per aprire Options Dialog Box (Finestra di Dialogo di Opzioni) mostrato qui sotto:
La Finestra di Dialogo di Opzioni del File di Soluzione
Accendere la finestra di controllo Nonzero Values Only (Solo Valori Differenti da Zero)cliccandoci sopra.
Chiudere la finestra di dialogo premendo il bottone; OK.
Dopo aver cambiato l'opzione Nonzero Values Only (Solo Valori Differenti da Zero), il prossimo passo sarà risolvere il modello scegliendo Solve CPLEX; dal menu; Run (Eseguire). Se tutto procede bene MPL visualizzerà il messaggio "Optimal Solution Found" (Trovata Soluzione Ottimale). Se c'è una finestra con un messaggio d'errore di sintassi per favore, controllare la formulazione inserita nel dettaglio precedentemente in questa sessione, con la lista del modello.
Dato che il modello con cui state lavorando sta diventando più grande, cercate di guardare solo alcune parti della soluzione, invece che l'intero file di soluzione. Questa volta, invece che elencare l'intero file di soluzione, useremo la finestra di modello ad albero di definizioni, al fine di visulaizzare solo le parti della soluzione che c'interessano.
La finestra di definizioni del modello vi permette di vedere tutti gli articoli definiti dalla formulazione del modello in un albero gerarchico in cui ogni ramo corrisponde ad una sezione del modello. In MPL è, normalmente, buona idea lasciare la finestra ad albero sempre aperta. MPL, poi, aggiornerà automaticamente i suoi contenuti tutte le volte che risolverete il modello. Guardando le definizioni del modello per il Planning5 scegliere Model Definitions (Definizioni del Modello) dal menu View (Vista).
La Finestra di Definizioni del Modello per il; Planning5
Dalla finestra ad albero, potete selezionare ogni articolo definito nel modello guardando i valori reali di quest'ultimo. Per esempio, guardando i valori per la variabile Produce (Prodotto), fare doppio click sull'articolo Produce (Prodotto) nell' albero, o selezionarlo e poi premere il bottoneView(Vista). Questo visualizzerà una finestra che contiene solo i valori per la variabile Produce (Prodotto).
VARIABLE Produce[plant,product,month] : plant product month Activity Reduced Cost ----------------------------------------------------------- p1 A1 Jan 4300.0000 0.0000 p1 A1 Feb 4200.0000 0.0000 p1 A1 Mar 6400.0000 0.0000 p1 A1 Apr 5300.0000 0.0000 p2 A2 Jan 4500.0000 0.0000 p2 A2 Feb 5400.0000 0.0000 p2 A2 Mar 6500.0000 0.0000 p2 A2 Apr 7200.0000 0.0000 p3 A3 Jan 5400.0000 0.0000 p3 A3 Feb 6000.0000 0.0000 p3 A3 Mar 6900.0000 0.0000 p3 A3 Apr 6600.0000 0.0000 p4 A3 Feb 700.0000 0.0000 p4 A3 Mar 900.0000 0.0000 p4 A3 Apr 1600.0000 0.0000 -----------------------------------------------------------
Se si guardano i valori di attività per la variabile Produce (Prodotto) vedrete che questa volta stiamo riempiendo la richiesta per tutti i prodotti dato che ora abbiamo abbastanza capacità. Il modello decide quali impianti vengono usati q per quali prodotti.Per esempio, l'impianto p1 viene usato per produrre il prodotto A1, l'impianto p2 viene usato per il prodotto A2, e gli impiantip3 e p4 vengono usati per il prodotto A3.
Se andate ancora alla finestra ad albero e aprite la finestra per il vincolo ProdCapacity avrete i seguenti valori di soluzione
plant | month | Slack | Shadow Price |
---|---|---|---|
p1 | Jan | 14.4000 | 0.0000 |
p1 | Feb | 11.6000 | 0.0000 |
p1 | Mar | 10.2000 | 0.0000 |
p1 | Apr | 11.4000 | 0.0000 |
p2 | Feb | 8.0000 | 0.0000 |
p2 | Mar | 8.5556 | 0.0000 |
p2 | Apr | 6.0000 | 0.0000 |
p3 | Jan | 5.0000 | 0.0000 |
p4 | Jan | 23.0000 | 0.0000 |
p4 | Feb | 18.0000 | 0.0000 |
p4 | Mar | 20.4286 | 0.0000 |
p4 | Apr | 17.4286 | 0.0000 |